package com.bsoft.rpc.basic.serialization;

import com.alibaba.fastjson.JSON;
import com.bsoft.rpc.basic.serialization.bean.Person;
import org.springframework.util.StopWatch;

/**
 * JDK:
 * 序列化大小：411
 * 100万序列化总耗时：4131ms
 * 100万反序列化总耗时：9190ms
 *
 * JSON:
 * 序列化大小：390
 * 100万序列化总耗时：2497ms
 * 100万反序列化总耗时：3508ms
 *
 * hessian:
 * 序列化大小：360
 * 100万序列化总耗时：7632ms
 * 100万反序列化总耗时：5702ms
 *
 * hessian2:
 * 序列化大小：265
 * 100万序列化总耗时：4531ms
 * 100万反序列化总耗时：2150ms
 *
 * FST:
 * 序列化大小：176
 * 100万序列化总耗时：2060ms
 * 100万反序列化总耗时：1714ms
 *
 * FST（优化）：
 * 序列化大小：244
 * 100万序列化总耗时：1460ms
 * 100万反序列化总耗时：1584ms
 *
 * kryo:
 * 序列化大小：253
 * 100万序列化总耗时：1440ms
 * 100万反序列化总耗时：1825ms
 *
 * kryo（优化）:
 * 序列化大小：189
 * 100万序列化总耗时：1291ms
 * 100万反序列化总耗时：1431ms
 *
 * protostuff:
 * 序列化大小：321
 * 100万序列化总耗时：1540ms
 * 100万反序列化总耗时：3197ms
 *
 */
public class MainTest {
    public static void main(String[] args) {
        // 构建对象
        Person person = Person.build();
        // 选择序列化方式
        Serialization serialization = SerializationFactory.getSerialization(SerializationType.PROTOSTUFF);

        // 序列化大小测试
        byte[] data = serialSize(serialization, person);
        // 序列化测试
        serialize(serialization, person);
        // 反序列测试
        deserialize(serialization, data);

    }

    /**
     * 序列化大小
     * @return
     */
    public static byte[] serialSize(Serialization serialization, Person person){
        byte[] data = serialization.serialize(person);
        System.out.println("序列化大小：" + data.length);
        Person deserialize = serialization.deserialize(data, Person.class);
        System.out.println(JSON.toJSONString(deserialize));
        return data;
    }

    /**
     * 序列化时间（100万）
     * @param serialization
     * @param person
     */
    public static void serialize(Serialization serialization, Person person) {
        StopWatch watch = new StopWatch("serialize");
        watch.start();
        for (int i = 0; i < 1000000; i++) {
            byte[] data = serialization.serialize(person);
        }
        watch.stop();
        System.out.println("100万序列化总耗时：" + watch.getTotalTimeMillis() + "ms");
    }

    /**
     * 反序列化时间（100万）
     *
     * @param serialization
     * @param data
     */
    public static void deserialize(Serialization serialization, byte[] data) {
        StopWatch watch = new StopWatch("deserialize");
        watch.start();
        for (int i = 0; i < 1000000; i++) {
            Person person = serialization.deserialize(data, Person.class);
        }
        watch.stop();
        System.out.println("100万反序列化总耗时：" + watch.getTotalTimeMillis() + "ms");
    }
}
